#pragma once
#include <stdbool.h>
//最小堆的结构体
typedef struct MinHeap
{
    /* 这个数组存储的是元素在原数组中的索引。
    例如，Index[i]存储的是在堆中位置为i的元素在原数组中的索引。*/
    int *index;//索引数组

    // 这个数组是Index数组的逆序数组。它存储的是堆中元素在Index数组中的位置。
    int *reverse;//反向查找数组

    /*这两个数组一起工作，使得我们可以在O(1)的时间复杂度内找到任意元素在堆中的位置，
    或者找到堆中任意位置的元素在原数组中的索引。
    这对于堆的插入、删除等操作非常有用。*/
    
    int size; // 堆的当前元素个数
    int capacity; // 堆的最大容量
} MinHeap;

MinHeap *createMinHeap(int capacity);

bool insertIndex(MinHeap *heap, int dist[], int v);

void fix_up(MinHeap *heap, int dist[], int i, int element);

int deleteMin(MinHeap *heap, int dist[]);

void deleteMinHeap(MinHeap *heap);
